iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0

學習原因:

執行測試以後,都需要產出測試報告,除了要顯示測試結果,更重要的作用是讓我們知道為什麼會測試失敗,原因有很多,可能是環境問題,可能測試程式的 Bug,也有可能是測試對象本身的 Bug,所以測試報告需要提供足夠的資訊,讓我們快速去判斷失敗的原因。

這裡會套用 Allure Report,同時需要配合 Logging,把需要的資訊記錄下來套在測試報告上。

學習目標:

  • 套用 Allure Report
  • 使用 Loggin 記錄所需資料
  • 了解測試報告的重要性,以設計測試報告所需的內容

Allure Report 的應用

應用 Allure Report,需要先安裝 Allure 的應用程序,可以參考官方的教學。若沒有 brew / scoop,需要先下載。

MacOS:

brew install allure

Window:

scoop install allure

然後需要在 Python 安裝與 Pytest 配合的套件

pip install allure-pytest

即可簡單使用如下:

# 在執行 pytest 的時候加入參數 —alluredir 指定測試結果輸出的位置,一般設定為 allure-results
# 這個參數也可以設定在 pytest.ini 喔
pytest --alluredir=allure-results

# 測試完成後,利用測試結果生成報告,並在默認的瀏覽器顯示報告
allure serve allure-results

這樣你就可以看到最基本的報告內容,做了多少個測試,測試通過率等資訊。然而,這些測試訊息還是不足夠讓我們清楚了解測試的內容的,所以我們必須要自行定制適合的報告,在報告中加入需要的信息,讓內容更豐富。

Allure Report 的設計

  1. 標記 Title & Description

    @allure.title@allure.description 為 test case 加入 title 和 description.

  2. 標記測試步驟

    使用 Annotation @allure.step,可以在 function 或 Class method 上標記,在測試報告會顯示為步驟。我會習慣在 Page Object 的 Method 都使用 @allure.step 標記成 step

    # 在 login_page.py 的 Class method 加入 @allure.step
    import allure
    
    class LoginPage:
        @allure.step(f"Input Username")
        def input_username(self, username):
            print(f"input {username}")
    
    		@allure.step("Input Password")
        def input_password(self, password):
            print(f"input {password}")
    

    而 Test Case 的步驟也會寫成 step,方式如下:

    # test_login.py
    
    @allure.title("Login Test")
    @allure.description("以 username, password 作登入測試 ")
    def test_login():
        login_page = LoginPage()
    
        with allure.step("登入"):
            # 運用 page object 的 method 完成了整個操作流程
            login_page.input_username("username")
            login_page.input_password("password")
    

    會使 Page Object Method 的 Step 嶔入到測試步驟中,清晰可以看到每個步驟,點擊進去可以再看更細的步驟資料。

    https://ithelp.ithome.com.tw/upload/images/20230926/201620382BCcGf37ZX.png

  3. 附件 Attachment

    在報告可以加入不同種類的附件,如圖片可放截圖/測試用的圖片等,來豐富報告的內容。可以通過以下方式加入。

    # 把資料創建成附件
    # allure.attach(content, attachment_name, attachment_type, extension)
    allure.attach("Content", "Text File", "text/plain", "txt")
    
    # 把現有的檔案加入附件
    # allure.attach.file(source, attachment_name, attachment_type, extension)
    allure.attach("attachment.txt", "Text File", allure.attach_type.TEXT)
    
    • content 是 Attachment 的內容 I.e. 文字內容
    • attachment_name: attachment 的名字
    • attachment_type: attachment 的檔案類型 (I.e. text/plain)
    • extension: attachment 的擴展名稱,是指在檔案名稱中的最後部分,用來識別該檔案的類型或格式的部分。 (I.e. txt)

    attachment_typeextension,一般都可用 allure.attach_type 的值來表示。

    # allure.attach_type 的值為 tuple,會包括 file type 和 extension。
    # 以下是常用的 Attach Type:
    TEXT = ("text/plain", "txt")
    CSV = ("text/csv", "csv")
    HTML = ("text/html", "html")
    XML = ("application/xml", "xml")
    JSON = ("application/json", "json")
    YAML = ("application/yaml", "yaml")
    PDF = ("application/pdf", "pdf")
    PNG = ("image/png", "png")
    JPG = ("image/jpg", "jpg")
    TIFF = ("image/tiff", "tiff")
    MP4 = ("video/mp4", "mp4")
    
  4. 標記嚴重性 (Severity)

    @allure.serverity 來標記嚴重性,帶入的參數為 allure.severity_level 的值。分別有 BLOCKER, CRITICAL, NORMAL, MINORTRIVIAL 。將會在報告顯示該 Test Case 的嚴重性。

    @allure.severity(allure.severity_level.NORMAL)
    

以上介紹常用的,allure 還有很多的 annotation 可以用來修飾報告,不妨參看官方網站

Logging

報告我們會記錄執行的步驟,但執行步驟過程,我們或許需要加入一些 Log 作記錄細節內容,以便發生問題的時候,用來查找問題。可直接應用 python 內建的 logging 套件。

pytest 中,log_level 可以設定多種不同的 Log 的級別。

以下是一些常見的等級:

  • CRITICAL:致命的錯誤,表示程序可能無法繼續運行。
  • ERROR:錯誤,但程序仍然可以繼續運行。
  • WARNING:表示一些意外情況可能會導致問題。
  • INFO:用來輸出程序運行時的一般信息。
  • DEBUG:用來輸出詳細的 Debug Message。

會根據設定的 log_level 顯示 該 level 以上的所有級別的 Log。

如一般都會將 log_level 設定為 INFO,則 INFOWARNINGERRORCRITICAL 級別的 Log 都會被顯示。而 DEBUG 級別的 Log 則不會被顯示。

DEBUG 的內容過於詳細,影響可讀性,有 Debug 需要時才會啟用。

這設定有助於確保你只看到你所關心的程式運行訊息,從而更容易 Debug。

關於 Log 相關配置,可以在 pytest.ini 作設定

# pytest.ini

# 全局的設定:
log_level = INFO 
log_date_format = %Y-%m-%d %H:%M:%S
log_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)

# 執行中顯示的 Log,設定為 True 即可啟用,相關設定若與全局不同才需要設定
log_cli = True
;log_cli_level = INFO
;log_cli_date_format = %Y-%m-%d %H:%M:%S
;log_cli_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)

# Log File 的設定,需要設定 Log File 生成位置。相關設定若與全局不同才需要設定
log_file = logs/pytest-logs.log
;log_file_level = INFO
;log_file_date_format = %Y-%m-%d %H:%M:%S
;log_file_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)

在程式碼中只需要 import logging,再應用 logging 加入訊息到對應的 Log Level 即可。

import logging

def test_log():
	# 加入 Log Message 至 Info Level
	logging.info("Log Here")

測試報告的重要性

  1. 提供可視化結果:以圖表、表格和文字的形式呈現測試運行的結果,使能夠直觀地了解測試的狀態、通過率以及問題。
  2. 了解測試內容:清晰的測試步驟,使能解清楚了解測試的內容
  3. 追蹤問題:有詳細的執行記錄,可提供足夠的資訊讓開發人員 Debug。
  4. 追蹤歷史記錄:記錄每次測試運行的結果,讓開發團隊可以追蹤測試的歷史記錄,了解測試的變化和進展。
  5. 測試優化:可以分析哪些測試通過,哪些失敗,從而優化測試用例的撰寫和執行,提高測試效率。

基於以上的目的,我們的測試報告內容設計相當重要。你需要判斷哪些資訊值得被記錄下來,是可以有效提高 Debug 的速度,和作為分析優化。

以下會有一些建議的 Report 內容可供參考:

  1. Steps (操作過程式的記錄)
  2. Test Data
  3. 過程中的 Output
  4. UI 測試:Element Locator 以及查找所需時間
  5. UI 測試:關鍵的截圖
  6. API 測試:HTTP Method, Header, Request / Response Body, HTTP Status 等資料
  7. 判斷 Test Case Passed / Failed 的 實際與預期結果資料

上一篇
Day 23: 測試框架 - PyTest
下一篇
Day 25: 應用 Jenkins 串接測試流程
系列文
從 0 開始培育成為自動化測試工程師的學習指南30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言